自己的理解:git server
就是一个remote 的git
仓库。相当于在服务器端创建的一个git
仓库,然后客户端从这个仓库获取代码以及推送代码到这个仓库。
需求是获取代码,然后做相应的修改再推送代码。即服务器的配置、客户端与服务器的连接方式、服务器端创建仓库、客户端克隆服务器端仓库。
服务器的配置
一般是专门创建一个用户来管理git
。
现在就可以在查看/home/
目录下面是否含有git
用户目录,没有可以直接创建一个。现在相当于在服务器上拥有了一个专门用来管理git
的用户,目录是/home/git
。一般为了安全着想会禁用掉git
的shell
执行能力。
改成下面的样式,就是在git
用户模式下无法执行shell
脚本。
以上创建了一个没有执行shell
脚本能力的git
用户,为后面git
提供服务。
客户端和服务器的连接方式
从Github
的使用来说,可以使用http(s)
或者ssh
协议(还有git
协议和本地协议)来处理客户端和服务器的连接。这里只讲讲ssh
协议的连接。
在/home/git/
目录下面创建.ssh
目录。并且创建文件authorized_keys
。
在客户端生成key
,保存在用户目录的.ssh
目录里面。一般是id_rsa
保存私钥,id_rsa.pub
保存公钥。
不指定目录的话,现在就可以在用户目录的.ssh
目录下面找到id_rsa
和id_rsa.pub
。
最后需要做的是id_rsa.pub
的内容写入到上面创建的authorized_keys
文件。
然后就可以试着连接你的服务器了。
服务器端创建仓库
一般使用git init
来创建仓库,但是在服务器上面一般是用git init --bare
创建裸仓库(裸仓库相对普通仓库是不含有自己的工作区,即只包含了.git
里面的内容)。git init --bare
创建裸仓库可以直接push
代码。不是裸仓库的话,从其它客户端没办法直接push
的,需要设置git config receive.denyCurrentBranch ignore
,通过git clone ssh://git@servername:22/sample.git
来拉取代码,然后才可以push
。
在/home/git/
目录下面创建裸仓库。
客户端克隆服务器端仓库
克隆代码。
之后的操作就跟在客户端操作普通的git
一样了。
问题
上面似乎一切ok,但是如何在服务器得到git
的工作目录(源代码),毕竟服务器也是需要git
上面的源代码执行的。在服务器中创建一个目录clone 代码就ok 了。那么问题就转化成如何在客户端每次push
的时候在服务器的工作目录下git pull
最新的代码。这里就需要使用到git
的hooks
函数了。在/home/git/sample.git/hooks
目录下面就有很多个hooks
函数,每当git执行到相应的操作的使用就会执行里面的hooks
。
创建一个post-receive
(在客户端推送完成后执行)。
现在需要做的是在post-receive
执行源代码的更新。将下面内容复制到post-receive
文件中。
上面的操作就完成了当客户端push
以后服务器会将最新的代码更新到/home/git/sample
目录下面。
还有可能有一些权限的问题,否则push代码时候会报没写入权限的错。
chown
修改所属用户。chomod
修改文件权限。